using System;
using System.Collections.Generic;
using ComposicionPedidos;
using AdministracionPreparacion;

namespace AdministracionPedidos
{
	/// <summary>
	/// Summary description for ColaAsignacion.
	/// </summary>
	public class ColaAsignacion
	{
        private Queue<KeyValuePair<Pedido, int>> _pedidosAsignados;
        private List<Observador> _observadores;

		public ColaAsignacion()
		{
            _pedidosAsignados = new Queue<KeyValuePair<Pedido, int>>();
            _observadores = new List<Observador>();

            Observador obsPrepPizza = new ObsColaPreparacionPizza();
            Observador obsPrepEmpanada = new ObsColaPreparacionEmp();

            _observadores.Add(obsPrepEmpanada);
            _observadores.Add(obsPrepPizza);
		}

        public Queue<KeyValuePair<Pedido, int>> getPedidosAsignados()
        {
            return _pedidosAsignados;
        }

        public List<Observador> getObservadores()
        {
            return _observadores;
        }

        public void setObservadores(List<Observador> observadores)
        {
            _observadores = observadores;
        }

        public void asiganarPedido(Pedido pedido, int idHorno)
        {
            _pedidosAsignados.Enqueue(new KeyValuePair<Pedido,int>(pedido,idHorno));
            notificar(pedido);
        }

        public void asiganarPedidoSoloPizzas(Pedido pedido)
        {
            //Al cero hay que reemplazarlo por el id del horno que corresponda
            _pedidosAsignados.Enqueue(new KeyValuePair<Pedido, int>(pedido, 0));
            notificar(pedido);
        }

        public void asiganarPedidoSoloEmpanadas(Pedido pedido)
        {
            //Al uno hay que reemplazarlo por el id del horno que corresponda
            _pedidosAsignados.Enqueue(new KeyValuePair<Pedido, int>(pedido, 1));
            notificar(pedido);
        }

        public Pedido getPedido(int nroPedido)
        {
            foreach (KeyValuePair<Pedido, int> t in _pedidosAsignados)
            {
                if (t.Key.Numero.Equals(nroPedido))
                {
                    return t.Key;
                }
            }

            return null;
        }
        
        public Pedido getUltimo()
        {
            if (_pedidosAsignados.Count > 0)
            {
                return _pedidosAsignados.Peek().Key;
            }
            else
            {
                return null;
            }
        }

        private void notificar(Pedido p)
        {
            foreach (Observador obs in _observadores)
            {
                obs.actualizar(p);
            }
        }

        private void push(Pedido pedido, int idHorno)
        {
            _pedidosAsignados.Enqueue(new KeyValuePair<Pedido, int>(pedido, idHorno));
        }

    }
}
